import {
	XRHandPrimitiveModel
} from './XRHandPrimitiveModel.js';

import {
	XRHandOculusMeshModel
} from './XRHandOculusMeshModel.js';

class XRHandModel extends THREE.Object3D {

	constructor(controller) {

		super();

		this.controller = controller;
		this.motionController = null;
		this.envMap = null;

		this.mesh = null;

	}

	updateMatrixWorld(force) {

		super.updateMatrixWorld(force);

		if (this.motionController) {

			this.motionController.updateMesh();

		}

	}

}

class XRHandModelFactory {

	constructor() {

		this.path = '';

	}

	setPath(path) {

		this.path = path;
		return this;

	}

	createHandModel(controller, profile, options) {

		const handModel = new XRHandModel(controller);

		controller.addEventListener('connected', (event) => {

			const xrInputSource = event.data;

			if (xrInputSource.hand && !handModel.motionController) {

				handModel.visible = true;
				handModel.xrInputSource = xrInputSource;

				// @todo Detect profile if not provided
				if (profile === undefined || profile === 'spheres') {

					handModel.motionController = new XRHandPrimitiveModel(handModel, controller, this.path, xrInputSource.handedness, { primitive: 'sphere' });

				} else if (profile === 'boxes') {

					handModel.motionController = new XRHandPrimitiveModel(handModel, controller, this.path, xrInputSource.handedness, { primitive: 'box' });

				} else if (profile === 'oculus') {

					handModel.motionController = new XRHandOculusMeshModel(handModel, controller, this.path, xrInputSource.handedness, options);

				}

			}

		});

		controller.addEventListener('disconnected', () => {

			// handModel.motionController = null;
			// handModel.remove( scene );
			// scene = null;

		});

		return handModel;

	}

}

export { XRHandModelFactory };
